/*
 * Copyright (c) 2025, 大连理工大学 (Dalian University of Technology)
 *
 * Licensed under the Mulan PSL v2.
 * You can use this file according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of the License at
 *
 *     http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. SEE THE MULAN PSL v2
 * FOR MORE DETAILS.
 */

#pragma once
#include <map>
#include <memory>
#include <string>
#include <typeindex>

#include "DBManager/Database/IDatabase.h"

SG_DBMANAGER_NAMESPACE_OPEN

class DatabaseFactoryPrivate;

/**
 * @class DatabaseFactory
 * @brief 用于根据指定类型创建数据库实例的工厂类。
 */
class DBManager_DECLSPEC DatabaseFactory
{
  public:
    /**
     * @enum DatabaseType
     * @brief 枚举类型，用于指定数据库类型。
     */
    enum DatabaseType : std::uint8_t
    {
        UNKNOWN,
        MEMORY, /**< 内存数据库 */
        HDF5    /**< HDF5 数据库 */
    };

    /**
     * @brief 创建并返回指定类型的数据库实例。
     *
     * @param dataType 要创建的数据库类型（如 MEMORY、HDF5）。
     * @param folderPath 数据库文件所在或将要创建的目录路径。
     * @param fileName 数据库文件的名称。
     * @return 指向 IDatabase 实例的共享指针。
     *
     * 该函数根据传入的数据库类型创建相应的实例，并使用指定的文件路径和名称进行配置。
     */
    IDatabase* GetDatabase (DatabaseType dataType, const std::string& folderPath, const std::string& fileName);
    /**
     * @brief 创建指定类型的数据库实例并存储在全局 map 中。
     *
     * @param dataType 要创建的数据库类型（如 memory 或 HDF5）。
     * @param folderPath 数据库文件所在的文件夹路径。
     * @param fileName 数据库文件名。
     */
    void CreatDatabase (DatabaseType dataType, const std::string& folderPath, const std::string& fileName);

    /**
     * @brief    销毁数据库
     *
     * @author   wuxingchuang
     * @date     2025.01.22
     */
    void DestroyDatabase (IDatabase* database);

    /**
     * @brief 构造函数，设置为保护以防止直接实例化。
     */
    DatabaseFactory ();

    /**
     * @brief 析构函数，设置为保护以防止直接销毁。
     */
    ~DatabaseFactory ();

  private:
    DatabaseFactoryPrivate* m_dataBaseFactoryPrivate;
};

SG_DBMANAGER_NAMESPACE_CLOSE
